package datastructure.queue;

import datastructure.array.Array;

public class ArrayQueue<E> implements Queue<E> {

    // 使用数组完成对列的基本操作
    private Array<E> arr;

    // 空参构造
    public ArrayQueue() {
        arr = new Array<>();
    }

    // 带参构造完成指定容量
    public ArrayQueue(int capacity) {
        arr = new Array<>(capacity);
    }

    @Override
    public void enqueue(E e) {
        // 添加元素一般是向队尾添加元素,这样我们就可以向数组的末尾添加元素
        arr.addLast(e);
    }

    @Override
    public E dequeue() {
        // 删除元素一般是1取队首元素,就是数组头位置元素,这样一来删除元素的时间复杂度就是O(n)级别的
        // 其他操作都是O(1)级别的,这样我们就需要对对列进行该井.
        return arr.removeFirst();

    }

    // 查看队首元素
    @Override
    public E peek() {
        return arr.getFirst();
    }

    @Override
    public int getSize() {

        return arr.getSize();
    }

    @Override
    public boolean isEmpty() {

        return arr.isEmpty();
    }

    // 由于是用数组实现的所以可以获取容量
    public int getCapacity() {
        return arr.getCapacity();
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();

        sb.append("Queue:");
        sb.append("front [");
        for (int i = 0; i < arr.getSize(); i++) {
            // 拼接第i个元素
            sb.append(arr.get(i));
            // 给非最后一个元素末尾拼接逗号
            if (i != arr.getSize() - 1) {
                sb.append(",");
            }
        }

        // 拼接最后一个]
        sb.append("] tail");
        return sb.toString();
    }

    public static void main(String[] args) {
        ArrayQueue<Integer> queue = new ArrayQueue<>();

        for (int i = 0; i < 10; i++) {
            queue.enqueue(i);
            System.out.println(queue);
            if (i % 3 == 2) {
                System.out.println(queue.dequeue());
            }
        }

    }

}
